package com.demo.juc.thread;

import java.util.concurrent.*;

/**
 * @Author: jxm
 * @Description: 线程池
 * @Date: 2023/2/27 14:36
 * @Version: 1.0
 */
public class ThreadPoolDemo {


    /**
     * 1、核心线程数（corePoolSize）：
     * 核心线程数是线程池中保持活动状态的线程数。即使没有任务需要执行，核心线程也不会被回收。当有新任务提交时，如果核心线程都在忙碌，则会创建新的线程来处理任务。
     *
     * 2、最大线程数（maximumPoolSize）：
     * 最大线程数是线程池中允许的最大线程数。当工作队列满了并且活动线程数达到最大线程数时，如果还有新任务提交，线程池将创建新的线程来处理任务。但是，超过最大线程数的线程可能会导致资源消耗过大。
     *
     * 3、空闲线程存活时间（keepAliveTime）：
     * 空闲线程存活时间指的是非核心线程在没有任务执行时的最长存活时间。当线程池中的线程数超过核心线程数且空闲时间达到设定值时，多余的线程将被终止，直到线程池中的线程数不超过核心线程数。
     *
     * 4、时间单位（unit）：
     * 时间单位是用于表示核心线程数和空闲线程存活时间的单位。常见的时间单位包括秒、毫秒、分钟等。
     *
     * 5、工作队列（workQueue）：
     * 工作队列用于存储待执行的任务。当线程池中的线程都在忙碌时，新提交的任务将被添加到工作队列中等待执行。常见的工作队列类型有有界队列（如 ArrayBlockingQueue）和无界队列（如 LinkedBlockingQueue）等。
     *
     * 6、线程工厂（threadFactory）：
     * 线程工厂用于创建新线程。线程工厂提供了创建线程的方法，可以自定义线程的名称、优先级等属性。
     *
     * 7、拒绝策略（rejectedExecutionHandler）：
     * 拒绝策略定义了当线程池无法接受新任务时的处理策略。当工作队列已满且线程池中的线程数已达到最大线程数时，新任务将被拒绝执行。常见的拒绝策略有丢弃、丢弃最旧的任务、抛出异常等。
     */

    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(), //默认工厂
                new ThreadPoolExecutor.AbortPolicy()); //银行满了，但是还有人进来，不处理这个人，并抛出异常

        //总线程数量= 最大线程数量 + 阻塞队列数量，超过抛出异常
        //9 > 5 + 3
        try {
            for (int i = 1; i <= 9; i++) {
                executor.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"-OK");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            executor.shutdown();
        }

    }

}
